package com.neuedu.curd.controller;

import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * 项目    ： spring-mvc-java1
 * 创建时间 ：2020/4/1  8:53 01
 * author  ：jshand-root
 * site    :  http://314649444.iteye.com
 * 描述     : 文件上传下载的控制器
 */
@Controller
public class FileUploadController {

    //上传到目标文件夹
    private static final String BASE_DIR = "D:\\java4upload\\";


    @RequestMapping("/index")
    @ResponseBody
    public String success() {
        return "success";
    }


    /**
     * 接受浏览器上传文件的控制器方法
     *
     * @return
     */
    @RequestMapping(value = "/upload_file", method = RequestMethod.POST) //只允许post提交
    public String upload(MultipartFile[] myfile) throws IOException {

        //myfile 此对象代表上传到服务器的文件句柄，在临时目录,需要转储到指定的目录（D:\\java1upload）

        //myfile 在Tomcat的临时目录中
        for (MultipartFile file : myfile) {

            //转储到指定位置
            //生成唯一的文件名
            //转储的目标文件  destFile  "D:\\java4upload\\";
            File destFile = new File(BASE_DIR, getNewFileName(file.getOriginalFilename()));
            destFile.createNewFile();
            file.transferTo(destFile); //转储的方法
        }
        return "redirect:/filelist";
    }


    @RequestMapping(value = "/filelist")
    public String filelist(Model model) throws IOException {

        //查询数据库 返回list （文件）

        //暂时直接列表 D:\java1upload
        File uploadDir = new File(BASE_DIR);

        //所有文件的数组
        File[] files = uploadDir.listFiles();
        model.addAttribute("files", files);//将集合放到作用域中。

        return "/file/file_list";
    }

    /**
     * 随机不重复的文件名
     *
     * @param orgName
     * @return
     */
    public static String getNewFileName(String orgName) {

        String newFileName = UUID.randomUUID().toString().replace("-", "");
        newFileName += orgName.substring(orgName.lastIndexOf("."));
        return newFileName;
    }


    @RequestMapping(value = "/download")
    public ResponseEntity download(String filename) throws IOException {


        //即将下载点文件目标
        File destFile = new File(BASE_DIR, filename);

        ResponseEntity entity = ResponseEntity.ok().
                //mime
                header(HttpHeaders.CONTENT_TYPE, "application/octet-stream").
                //通知浏览器以什么方式处理响应结果（直接打开，附件下载）
                header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + destFile.getName() + "\"").
                //设置body中为文件资源
                body(new FileSystemResource(destFile));
        return entity;

    }
}